package demo2;

import java.util.concurrent.*;

public class Demo2_1 {
    public static void main(String[] args) {
        /*
        * 默认的线程池使用的队列策略简单要注意量大的情况
        * 同时只有一个线程在执行
        * */
        ExecutorService service = Executors.newSingleThreadExecutor();
        service.execute(() -> {
            for (int i = 0; i < 5; i++){
                System.out.println("MyJob " + i);
            }
        });

        for (int i = 0; i < 5; i++) {
            System.out.println("main "+i);
        }

        service.shutdown();


        /*
        * 同时又固定数量的线程执行
        * */
        ExecutorService executorService2 = Executors.newFixedThreadPool(10);
        executorService2.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("run 方法");
            }
        });
        executorService2.shutdown();


        /*
         * 核心线程数为0，最大线程数量为Integer.maxValue
         * 用于单个线程执行时间较短的场景使用
         * */
        ExecutorService executorService3 = Executors.newCachedThreadPool();
        for (int i = 1; i <= 200; i++) {
            final int j = i;
            executorService3.execute(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":" + j);
            });
        }
        executorService3.shutdown();

        ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(1);
        schedulePool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("run 方法执行");
            }
        }, 1000, TimeUnit.MILLISECONDS);
        schedulePool.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println("固定延时run2 方法执行");
            }
        }, 0, 1000, TimeUnit.MILLISECONDS);//表示以固定延时执行任务，延时是相对当前任务结束为起点计算开始时间。
        schedulePool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("固定周期执行");
            }
        }, 0, 1000, TimeUnit.MILLISECONDS);//表示以固定频率执行的任务，如果当前任务耗时较多，超过定时周期period，则当前任务结束后会立即执行。

        /*
        * 如果需要定制自己的线程池可以直接new ThreadPoolExecutor
        *
        * */
    }
}
